package com.sam.designpatterns

import java.util.*

class Game {
    var life = 100 //生命值
    var level = 1 //等级
    val random = Random()

    fun play() {
        println("开始打怪升级")
        life -= random.nextInt(50)
        level += random.nextInt(5)
        println("打完收工")
    }

    fun quit() {
        println("--------------------")
        println("退出游戏")
        println("退出时的属性，${toString()}")
        println("--------------------")
    }

    override fun toString(): String {
        return "生命值：$life, 等级：$level"
    }

    fun createMemento(): Memento {
        println("保存游戏属性~~~")
        return Memento(life, level)
    }
    fun restore(memento: Memento) {
        life = memento.life
        level = memento.level
        println("读取存档后的属性，${toString()}")
    }
}

// 备忘录
class Memento(
        var life: Int,// 存生命值，否则下线重新上线就满血复活了
        var level: Int // 存等级，否则一下线就白玩了
)

class Caretaker {
    private lateinit var memento: Memento
    fun archive(memento: Memento) {
        //存档模拟，实际上应该系列化到文件，或上传到服务端
        this.memento = memento
        println("存档完成~~~")
    }

    fun loadMemento(): Memento {
        return memento
    }
}

fun main() {
    val game = Game()
    game.play()

    val caretaker = Caretaker()
    caretaker.archive(game.createMemento())
    game.quit()

    // 重新打开游戏。
    val newGame = Game()
    newGame.restore(caretaker.loadMemento())
}
